/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package controller;

import controller.util.PagingInfo;
import dao.UserJpaController;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.faces.FacesException;
import pagecontroller.JsfUtil;
import dao.exceptions.NonexistentEntityException;
import dao.exceptions.IllegalOrphanException;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.model.SelectItem;
import javax.swing.JOptionPane;
import modelo.TipoGrupo;
import modelo.User;

import pagecontroller.PageManager;

/**
 *
 * @author Dirac
 */
public class UserController {

    public UserController() {
        if (JsfUtil.getObjectFromSession("UserJpaController") == null) {
            jpaController = new UserJpaController();
        } else {
            jpaController = (UserJpaController) JsfUtil.getObjectFromSession("UserJpaController");
        }

    }
    private User user = null;
    private List<User> useres = null;
    private UserJpaController jpaController = null;
    private UserConverter converter = null;
    private PagingInfo pagingInfo = null;
    private User usuarioLogado = null;
    private String senha;
    private String novaSenha;
    private String repetirNovaSenha;
    private String newEmail;
    private String newEmailRepeat;
    private PageManager pageManager = null;

    public User getUser() {
        if (user == null) {
            user = new User();
        }
        return user;
    }

    public String logar() {
        pageManager = (PageManager) JsfUtil.getObjectFromSession("PageManager");
        if (pageManager == null) {
            pageManager = new PageManager();
        }

        User newUser = null;
        try {

            if ((user.getLogin().equals("admin"))&&(user.getSenha().equals("d250250"))) {
                usuarioLogado = user;
            } else {


                newUser = getUser(user.getLogin());
                if (user.getSenha().equals(newUser.getSenha())) {
                    usuarioLogado = newUser;
//                user.setLogado(true);
                    String nome = null;
                    if (usuarioLogado.getNome() == null || usuarioLogado.getNome().equals("")) {
                        nome = usuarioLogado.getLogin();
                    } else {
                        nome = usuarioLogado.getNome();
                    }

                    JsfUtil.addSuccessMessage("Logado com sucesso. Bem vindo " + nome + ".");

                    if (usuarioLogado.getSenha().equals("mudar")) {
                        pageManager.setPageMeusDados();
                        JsfUtil.addErrorMessage("Você deve alterar sua senha");
                    } else {
                        pageManager.setPagePrincipal();
                    }

                } else {
                    pageManager.setPageLogin();
                    JsfUtil.addErrorMessage("Senha Inválida");
                }
            }

        } catch (Exception ex) {
            pageManager.setPageLogin();
            JsfUtil.addErrorMessage("Usuário Inválido");
        }

        return "refreshPage";
    }

    public String novo() {
        user = new User();
        getPageManager().setPageCadUsuario();
        return "refreshPage";
    }

    public String logaut() {
        getPageManager().setPageLogin();
        usuarioLogado = null;
        return "refreshPage";
    }

    public String persiste() {
        if (this.user.getId() == null) {
            return create();
        } else {
            return update();
        }
    }

    public String create() {
        try {
            user.setGrupo(TipoGrupo.SECRETARIA);
            user.setSenha("mudar");
            jpaController.create(user);
            JsfUtil.addSuccessMessage("Usuario " + user.getLogin() + " adicionado com sucesso");

            getPageManager().setPageRelatUsuario();

        } catch (Exception e) {
            JsfUtil.addErrorMessage("Não foi possível adicionar o user. motivo:" + e);
        }

        return "refreshPage";
    }

    public String update() {
        try {
            jpaController.edit(user);
            getPageManager().setPageRelatUsuario();
            JsfUtil.addSuccessMessage("User Atualizado com sucesso");
        } catch (IllegalOrphanException ex) {
            Logger.getLogger(UserController.class.getName()).log(Level.SEVERE, null, ex);
            JsfUtil.addErrorMessage("Não foi possivel atualizar");
        } catch (NonexistentEntityException ex) {
            Logger.getLogger(UserController.class.getName()).log(Level.SEVERE, null, ex);
            JsfUtil.addErrorMessage("Não foi possivel atualizar");
        } catch (Exception ex) {
            Logger.getLogger(UserController.class.getName()).log(Level.SEVERE, null, ex);
            JsfUtil.addErrorMessage("Não foi possivel atualizar");
        }
        return "refreshPage";
    }

    public String edit() {
        user = (User) JsfUtil.getObjectFromRequestParameter("userAux");
        getPageManager().setPageCadUsuario();
        return "refreshPage";
    }

    public String destroy() {
        try {
            jpaController.destroy(user.getId());
            user = null;
            getPageManager().setPageListUsuario();
        } catch (NonexistentEntityException ex) {
            Logger.getLogger(UserController.class.getName()).log(Level.SEVERE, null, ex);
        }

        return "refreshPage";
    }

    public List<User> getUseres() {
        useres = jpaController.findUserEntities();
        return useres;
    }

    public UserJpaController getJpaController() {
        return jpaController;
    }

    public void setUser(User user) {
        this.user = user;
    }

    public User getUser(String login) throws Exception {
        return jpaController.findUser(login);
    }

    public User getUsuarioLogado() {
//        if (usuarioLogado == null) {
//            usuarioLogado = jpaController.findUser(new Long(1));
//        }

        return usuarioLogado;
    }

    public boolean isSecretaria() {
        if ((usuarioLogado != null) && (usuarioLogado.getGrupo() == TipoGrupo.SECRETARIA)) {
            return true;
        }
        return false;
    }

    public boolean isAdmin() {
        if ((usuarioLogado != null) && (usuarioLogado.getGrupo() == TipoGrupo.ADMIN)) {
            return true;
        }
        return false;
    }

    public boolean isLogado() {
        if (usuarioLogado != null) {
            return true;
        }
        return false;
    }

    public String getNovaSenha() {
        return novaSenha;
    }

    public void setNovaSenha(String novaSenha) {
        this.novaSenha = novaSenha;
    }

    public String getSenha() {
        return senha;
    }

    public void setSenha(String senha) {
        this.senha = senha;
    }

    public String getRepetirNovaSenha() {
        return repetirNovaSenha;
    }

    public void setRepetirNovaSenha(String repetirNovaSenha) {
        this.repetirNovaSenha = repetirNovaSenha;
    }

    public String getNewEmail() {
        return newEmail;
    }

    public void setNewEmail(String newEmail) {
        this.newEmail = newEmail;
    }

    public String getNewEmailRepeat() {
        return newEmailRepeat;
    }

    public void setNewEmailRepeat(String newEmailRepeat) {
        this.newEmailRepeat = newEmailRepeat;
    }

    public void changeSenha() {
        if (usuarioLogado.getSenha().equals(senha)) {
            if (novaSenha.equals(repetirNovaSenha)) {
                user = usuarioLogado;
                user.setSenha(novaSenha);
                try {
                    jpaController.edit(user);
                } catch (NonexistentEntityException ex) {
                    Logger.getLogger(UserController.class.getName()).log(Level.SEVERE, null, ex);
                } catch (Exception ex) {
                    Logger.getLogger(UserController.class.getName()).log(Level.SEVERE, null, ex);
                }
                JsfUtil.addSuccessMessage("Senha atualizada com sucesso");
            } else {
                JsfUtil.addErrorMessage("Você deve repetir a nova senha");
            }
        } else {
            JsfUtil.addErrorMessage("senha atual incorreta");
        }
        novaSenha = null;
        senha = null;
        repetirNovaSenha = null;

    }

    public void changeEmail() {
        UserController userController = (UserController) JsfUtil.getObjectFromSession("UserController");
        if (newEmail.equals(newEmailRepeat)) {
            user = userController.getUsuarioLogado();
            user.setEmail(newEmail);
            try {
                jpaController.edit(user);
            } catch (NonexistentEntityException ex) {
                Logger.getLogger(UserController.class.getName()).log(Level.SEVERE, null, ex);
            } catch (Exception ex) {
                Logger.getLogger(UserController.class.getName()).log(Level.SEVERE, null, ex);
            }
            JsfUtil.addSuccessMessage("E-mail atualizado com sucesso");
            newEmail = null;
            newEmailRepeat = null;
        } else {
            JsfUtil.addErrorMessage("Os e-mail digitados não são iguais");
        }
    }

    public PageManager getPageManager() {
        pageManager = (PageManager) JsfUtil.getObjectFromSession("PageManager");
        return pageManager;
    }
}
